/**
 * 
 */
package co.com.ebusiness.trader.model;

import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.apache.tapestry5.beaneditor.NonVisual;
import org.apache.tapestry5.beaneditor.Validate;

import co.com.ebusiness.trader.core.model.Empresa;
import co.com.ebusiness.trader.seguridad.model.Usuario;
import co.com.ebusiness.trader.utilidades.model.TipoCuenta;

/**
 * @author Luis Agudelo
 *
 */
@Entity
@Table(name = "trd_cuentas")
public class Cuenta {
	
	private int idCu;
	private String concepto;
	private double valor;
	private TipoCuenta tipoCuenta;
	private Date fecha = new Date();
	private Usuario usuario;
	private Empresa empresa;
	private List<Abono> abonos;
	
	
	/**
	 * @return the idCu
	 */
	@Id
    @GeneratedValue
    @Column(name = "idCu")
    @NonVisual
	public int getIdCu() {
		return idCu;
	}
	/**
	 * @param idCu the idCu to set
	 */
	public void setIdCu(int idCu) {
		this.idCu = idCu;
	}
	/**
	 * @return the concepto
	 */
	@Validate("required")
	public String getConcepto() {
		return concepto;
	}
	/**
	 * @param concepto the concepto to set
	 */
	public void setConcepto(String concepto) {
		this.concepto = concepto;
	}
	/**
	 * @return the valor
	 */
	@Validate("required")
	public double getValor() {
		return valor;
	}
	/**
	 * @param valor the valor to set
	 */
	public void setValor(double valor) {
		this.valor = valor;
	}
	/**
	 * @return the tipoCuenta
	 */
	@Column(name = "tipo", nullable = false, length = 10)
    @Validate("required")
    @Enumerated(EnumType.STRING)
	public TipoCuenta getTipoCuenta() {
		return tipoCuenta;
	}
	/**
	 * @param tipoCuenta the tipoCuenta to set
	 */
	public void setTipoCuenta(TipoCuenta tipoCuenta) {
		this.tipoCuenta = tipoCuenta;
	}
	/**
	 * @return the fecha
	 */
	@Validate("required")
	public Date getFecha() {
		return fecha;
	}
	/**
	 * @param fecha the fecha to set
	 */
	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}
	/**
	 * @return the usuario
	 */
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="idUsu")
	public Usuario getUsuario() {
		return usuario;
	}
	/**
	 * @param usuario the usuario to set
	 */
	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
	/**
	 * @return the empresa
	 */
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="idEmp")
	@NonVisual
	public Empresa getEmpresa() {
		return empresa;
	}
	/**
	 * @param empresa the empresa to set
	 */
	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}
	/**
	 * @return the abonos
	 */
	@OneToMany(mappedBy = "cuenta", cascade = {javax.persistence.CascadeType.ALL}, fetch=FetchType.LAZY, orphanRemoval=true) 
    public List<Abono> getAbonos() {
		return abonos;
	}
	/**
	 * @param abonos the abonos to set
	 */
	public void setAbonos(List<Abono> abonos) {
		this.abonos = abonos;
	}
	
	
	@Transient
	public double getTotalAbonado(){
		double totalAbonado = 0d;
		List<Abono> abonos = getAbonos();
		
		for(Abono abono : abonos){
			totalAbonado = totalAbonado + abono.getValor();
		}
		
		return totalAbonado;
	}
	

}
